package cn.leizp.springboot.auth;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.SignatureException;

import java.security.SecureRandom;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class MyToken {
    private static String SECRET_KEY = "fDta4Gqs0XXF2PI0tM6gpFlLAqIwJmmP1qof3abwGqr3JqGuqILBYdu0PLFeeUtQCrH6eF0b17bDnd58Ln8/SQ==";
    private static final long EXPIRATION_TIME = 24 * 60 * 60 * 1000; // 毫秒 
    
    public static void main(String[] args) {
        SecureRandom secureRandom = new SecureRandom();
        byte[] keyBytes = new byte[64]; // 512 位 = 64 字节
        secureRandom.nextBytes(keyBytes);
        String secretKey = Base64.getEncoder().encodeToString(keyBytes);
        System.out.println("生成的密钥: " + secretKey);
    }
    
    public static void setSecretKey(String key) {
    	SECRET_KEY = key;
    }
    
    /**
     * 生成 Token
     * 
     * @param username 用户名
     * @return Token 字符串
     */
    public static String generateToken(String username) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("username", username);
        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                .compact();
    }

    /**
     * 验证 Token
     * 
     * @param token Token 字符串
     * @return 若 Token 有效返回 true，否则返回 false
     */
    public static boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        } catch (SignatureException e) {
            System.err.println("无效的 Token 签名: " + e.getMessage());
        } catch (ExpiredJwtException e) {
            System.err.println("Token 已过期: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("Token 验证出错: " + e.getMessage());
        }
        return false;
    }

    /**
     * 从 Token 中获取数据对象
     * 
     * @param token Token 字符串
     * @return Claims 对象，包含 Token 中的数据
     */
    public static Claims getClaimsFromToken(String token) {
        try {
            return Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            System.err.println("从 Token 中获取数据出错: " + e.getMessage());
            return null;
        }
    }

    /**
     * 从 Token 中获取用户名
     * 
     * @param token Token 字符串
     * @return 用户名，如果 Token 无效则返回 null
     */
    public static String getUsernameFromToken(String token) {
        Claims claims = getClaimsFromToken(token);
        return claims != null ? (String) claims.get("username") : null;
    }

    /**
     * 判断 JWT token 是否过期
     * 
     * @param token JWT token
     * @return token 是否过期
     */
    private static boolean isTokenExpired(String token) {
        return extractExpiration(token).before(new Date());
    }

    /**
     * 从 JWT token 中提取过期时间
     * 
     * @param token JWT token
     * @return 过期时间
     */
    private static Date extractExpiration(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getExpiration();
    }
}
